package commons.params.param_component;

import commons.params.A_ParamsManager;
import commons.data.Zone;
import commons.data.Zone.TypeZone;
import java.util.ArrayList;
import javax.swing.JComponent;
import commons.utils.Utils;


public class ParamComponent_table_Zone extends AbstractParamComponent_table {

	public ParamComponent_table_Zone(String name, A_ParamsManager paramsManager, JComponent component, boolean bCanBeNull) {
		super(name, paramsManager, component, bCanBeNull,
				new String[] {"Nom zone", "Type", "X min", "X max", "Y min", "Y max"},
				new String[] {"nomZone", "typeZone", "xMin", "xMax", "yMin", "yMax"},
				new Class[] {String.class, String.class, String.class, String.class, String.class, String.class});
		
		// Les valeurs possibles sont figées, il n'est nécessaire de les paramétrées qu'une seule fois
		// Il s'agit simplement du type de zone, en 2ème colonne
		ArrayList<String> vTypeZone = new ArrayList<String>();
		TypeZone[] tabTypeZone = Zone.TypeZone.values();
		for (TypeZone typeZone : tabTypeZone)
			vTypeZone.add (typeZone.toString());
		possibleValues[1] = vTypeZone;
		table.setPossibleValues(possibleValues);
	}

	// Renvoit la liste des noms des zones déclarées par l'utilisateur
	public ArrayList<String> getListNomZones() {
		return getListValue(0);
	}

	public ArrayList<String> getListNomZones_plusZonePrincipale() {
		ArrayList<String> vRes = new ArrayList<String>();
		vRes.add(Zone.zonePrincipale.name);
		vRes.addAll(getListNomZones());
		return vRes;
	}

	// appelée à la fin par ParamsManager afin de constituer le Params
	public ArrayList<Zone> getVZone() {
		ArrayList<Zone> vZone = new ArrayList<Zone>();

		// On a toujours la zone principale
		vZone.add(Zone.zonePrincipale);

		for (int numRow = 0; numRow <data.size() ; numRow++) {
			Object[] rowData = data.get(numRow);
			Zone zon = new Zone((String) rowData[0],
								TypeZone.valueOf((String) rowData[1]),
								Double.parseDouble((String) rowData[2]),
								Double.parseDouble((String) rowData[4]),
								Double.parseDouble((String) rowData[3]),
								Double.parseDouble((String) rowData[5])	);

			vZone.add(zon);
		}
		return vZone;
	}
	
	//**************************************************************************
	//**************************************************************************

	public void makeStandardControls() {

		// Test si la table peut etre vide
		if (!bCanBeNull && bIsNull) {
			invalidateComponent("Il est obligatoire de déclarer des zones", true);
			return;
		}

		assert possibleValues[1] != null;

		beginControls();

		// Parcourt des row
		Object[] rowData;
		int numCol;

		for (int numRow = 0; numRow <data.size() ; numRow++) {
			rowData = data.get(numRow);

			//***** Nom de la zone *********************************************
			numCol = 0;
			basicCheck_NoDoublon(numRow, numCol);

			//***** Type de la zone ********************************************
			numCol = 1;
			basicCheck(numRow, numCol);

			//***** Coordonnées de la zone *************************************
			// On boucle car le test d'erreur est le même pour les 4 coords
			numCol = 2;
			for (int i=0 ; i<=3 ; i++) {
				basicCheck_Float(numRow, numCol + i);
			}
			
			// Il faut xMax > xMin et yMax > yMin
			numCol = 3;
			String valCoordMin, valCoordMax;
			valCoordMin = (String) rowData[numCol-1];
			valCoordMax = (String) rowData[numCol];
			if (Utils.isFloat(valCoordMin) && Utils.isFloat(valCoordMax) &&
					Double.parseDouble(valCoordMin)>=Double.parseDouble(valCoordMax))
				addError(numRow, numCol, "La coordonnées Max doit être supérieure à la coordonnée Min");

			numCol = 5;
			valCoordMin = (String) rowData[numCol-1];
			valCoordMax = (String) rowData[numCol];
			if (Utils.isFloat(valCoordMin) && Utils.isFloat(valCoordMax) &&
					Double.parseDouble(valCoordMin)>=Double.parseDouble(valCoordMax))
				addError(numRow, numCol, "La coordonnées Max doit être supérieure à la coordonnée Min");

		}
		finaliseControls();

	}

}
